/*
 * @Author: zi.yang
 * @Date: 2022-02-02 21:35:44
 * @LastEditors: zi.yang
 * @LastEditTime: 2022-02-09 10:22:36
 * @Description: egg router
 * @FilePath: \api-generator\app\router.js
 */
'use strict';

const { firstLetterToLowercase } = require('./utils/global');

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;

  const v1BaseUrl = '/api/v1';
  /**
   * Controller 命名规范：
   *  路由：
   *    正常命名，命名开头不允许为：[ 'Get', 'Post', 'Delete', 'Put' ]
   *    Controller 中的方法名称即路由地址,index 地址为：controller 模块名
   *
   *    如：
   *      1. login Controller 下的 loginError ,访问地址为：/loginError
   *      2. login Controller 下的 index ,访问地址为：/login
   *
   *  Api 接口：
   *    命名开头必须请求方法类型：[ 'Get', 'Post', 'Delete', 'Put' ]
   *    后面的方法名为路由名称: GetXxx|PostXxx|DeleteXxx|PutXxx
   *
   *    如：user Controller 下的 GetUserList
   *       请求路径为：/v1/user/userList
   */
  const methodsType = [ 'Get', 'Post', 'Delete', 'Put' ];
  Object.keys(controller).forEach(ctr => {
    Object.keys(controller[ctr]).forEach(fnName => {
      const isApi = /^(Get|Post|Delete|Put)/.test(fnName);
      // 添加页面路由
      if (!isApi) {
        const routerPath = fnName === 'index' ? ctr : fnName;
        router.get('/' + routerPath, controller[ctr][fnName]);
        return;
      }
      // 添加 API 方法
      let methodName = methodsType.find(type => fnName.indexOf(type) === 0);
      methodName = methodName.toLocaleLowerCase();
      let routerPath = fnName.replace(/^(Get|Post|Delete|Put)/i, '');
      routerPath = firstLetterToLowercase(routerPath);
      router[methodName](`${v1BaseUrl}/${ctr}/${routerPath}`, controller[ctr][fnName]);
    });
  });
  // 首页导航
  router.get('/', controller.home.index);
  // 登录校验
  router.post(`${v1BaseUrl}/login`, app.passport.authenticate('local', { successRedirect: '/', failureRedirect: '/loginError' }));
};
